Skip to content

fix greatest/least#25715

Open
daviszhen wants to merge 18 commits into
matrixorigin:mainfrom
daviszhen:0713-fix-greatest
Open

fix greatest/least#25715
daviszhen wants to merge 18 commits into
matrixorigin:mainfrom
daviszhen:0713-fix-greatest

Conversation

@daviszhen

Copy link
Copy Markdown
Contributor

What type of PR is this?

  • API-change
  • BUG
  • Improvement
  • Documentation
  • Feature
  • Test and CI
  • Code Refactoring

Which issue(s) this PR fixes:

issue #25215

What this PR does / why we need it:

参数类型规则

类型分类

  • nonbinary stringCHARVARCHARTEXTENUM 在本函数入口规范为 VARCHAR
  • binary stringBINARYVARBINARYBLOB
  • date-bearing temporalDATEDATETIMETIMESTAMP
  • supported temporal:date-bearing temporal 加 TIMEYEAR
  • numeric:整数、无符号整数、FLOAT、DECIMAL;BIT 按 numeric source 处理。
类型 family 代表 SQL 输入 决议中最重要的含义
nonbinary string 'abc'CAST('abc' AS TEXT)ENUM_col 与数字混合时走 text;它优先于 binary string;ENUM 先转 VARCHAR
binary string CAST('abc' AS BINARY)CAST('abc' AS BLOB) 没有 nonbinary string 时走 binary;不能与 JSON 混合。
date-bearing temporal DATE '2020-01-01'DATETIME '2020-01-01 12:00:00' 一旦和其他 family 混合,优先决定是否进入 packed-date。
TIME TIME '10:00:00' 它是 supported temporal,但不是 date-bearing;单独和数字/字符串混合时仍按 text。
YEAR CAST(2020 AS YEAR) 单独和 numeric/BIT 混合时走 year-numeric;和 DATE/DATETIME/TIMESTAMP 同时出现时转入 packed-date。
numeric / BIT 2CAST(2.5 AS DOUBLE)CAST(3 AS BIT) 纯 numeric 时走 numeric;和 nonbinary string 时走 text;和 DATE 时会成为待解析的日期文本。
本次不支持 INTERVAL '1' DAYGEOMETRY_col 解析阶段直接报参数类型错误,不能落入 executor。

INTERVAL、GEOMETRY/GEOMETRY32、SET 等不在本次 resolver 支持域。它们参与混合调用时
直接失败,不能因为另一个参数是 temporal 或 JSON 而进入特殊 overload。ENUM 是例外:
在所有分支前规范为 nonbinary VARCHAR,复用现有 ENUM -> VARCHAR cast。已有 executor
支持的 UUID、ROWID、array_float32array_float64 保留同 Oid 直通行为;这些类型的
混合组合仍不支持。

决议结果

resolver 对全部非 T_any 参数一次性产生以下结果:

resultType        对外返回类型
comparisonMode    numeric / text / binary / packed-date
temporalItemType  packed temporal 比较及 varlen 格式化依据;非 temporal 模式为空
castTypes         每个参数的 binder cast 目标
overloadID        普通或 temporal 专用执行器

优先级矩阵

按下表从上到下匹配,第一个命中的规则就是最终规则,不再继续向下匹配。所有“其余
参数”均指去除 T_any 后的其他参数。可以先按下面的顺序理解:

优先级决策图

GREATEST/LEAST(inputs)
|
|-- 去除 T_any 后没有参数?
|   `-- 是: VARCHAR NULL result
|
|-- 全部非 NULL 参数都是 JSON?
|   `-- 是: 全部 -> VARCHAR, text compare, normal overload
|
|-- 全部非 NULL 参数 Oid 相同且不是 JSON?
|   |
|   |-- 该 Oid 有普通 executor case?
|   |   `-- 否: 参数类型错误
|   |
|   `-- 是:
|       |
|       |-- DECIMAL / TIME / DATETIME / TIMESTAMP metadata 不同?
|       |   |
|       |   |-- 可以构造共同 type?
|       |   |   `-- 是: 全部 cast 到共同 type, normal overload
|       |   |
|       |   `-- 否(仅 DECIMAL 精度超过 DECIMAL256):
|       |       全部 cast 到 FLOAT64, normal overload
|       |
|       `-- 否: 保留原 type, normal overload
|
|-- 含 INTERVAL / GEOMETRY / UUID / ROWID / ARRAY / DATALINK 等不支持的混合 Oid?
|   `-- 是: 参数类型错误
|
|-- 含 JSON?
|   |
|   |-- 同时含 DATE / DATETIME / TIMESTAMP?
|   |   `-- 是: json-temporal, packed-date, result VARCHAR
|   |
|   |-- 含 BLOB / BINARY / VARBINARY,或 JSON + DATE + TEXT 等未覆盖组合?
|   |   `-- 是: 参数类型错误
|   |
|   `-- 否: JSON text 子矩阵
|       |-- 有 TEXT: result TEXT
|       `-- 其余允许 peer: result VARCHAR
|
|-- 含 DATE / DATETIME / TIMESTAMP?       <-- 压过 YEAR + numeric
|   `-- 是: temporal 子矩阵, packed-date
|       result = DATETIME / VARCHAR / TEXT / BLOB / VARBINARY(由 peer family 决定)
|
|-- 含 YEAR 且其余全部 numeric / BIT?
|   `-- 是: year-numeric overload, YEAR 保留 T_year, result = common numeric type
|
|-- 全部 numeric / BIT?
|   `-- 是: common numeric type, numeric compare
|
|-- 剩余 temporal + string/binary,或无 temporal 的 string/binary family?
|   `-- TEXT > CHAR/VARCHAR > BLOB > BINARY/VARBINARY
|       result = TEXT / VARCHAR / BLOB / VARBINARY
|
`-- 其他: 参数类型错误

读图时最容易错的两点:JSON 在普通 string/binary 规则前被截获;DATE/DATETIME/TIMESTAMP
YEAR + numeric 前被截获。TIME 本身不是 date-bearing temporal,因此
GREATEST(TIME '10:00:00', 2) 会继续走 text,而不是 packed-date。

  1. 先跳过 NULL literal;全是 NULL 直接返回 NULL。
  2. 纯 JSON 先处理,避免 JSON 落进同 Oid 快路径。
  3. 非 JSON 先过滤 executor 不支持的类型;即使两个参数 Oid 相同也不能放行。
  4. 只要有 JSON,优先只在 JSON 子矩阵中决议,不能继续落入普通 string/binary 规则。
  5. 没有 JSON 时,只要有 date-bearing temporal(DATE/DATETIME/TIMESTAMP),优先进入
    packed-date 子矩阵;它会压过 YEAR + numeric 和普通字符串规则。
  6. 没有 date-bearing temporal 时,才区分纯 numeric、YEAR + numeric、TIME + peer,以及
    最后的 text/binary family。

例如 GREATEST(CAST(2020 AS YEAR), DATE '2020-01-01', 1) 在第 5 步命中
date-bearing temporal 规则,1 会先转成字符串并按已选的 DATE 类型解析;它不会进入后面的
YEAR + numeric 规则。相反,GREATEST(CAST(2020 AS YEAR), 1999) 没有 date-bearing temporal,
才会命中 year-numeric 规则。

具体约束如下:

  1. 纯 JSON 特殊规则优先于同 Oid 快路径;JSON 与日期类 temporal 使用独立
    json-temporal overload,保留 JSON 来源。
  2. 同 Oid 快路径只保留已有 executor 明确支持的非 JSON Oid。INTERVAL、GEOMETRY
    等即使全部参数同 Oid 也必须在分派前拒绝,不能落入普通 executor 的
    panic("unreached code")。DECIMAL、TIME、DATETIME、TIMESTAMP 的 Width/Scale
    不同时,不属于无 cast 快路径,必须先做 metadata alignment。若 DECIMAL 共同精度超过
    DECIMAL256,与普通 numeric resolver 一致,全部转 FLOAT64,不能退回第一个
    DECIMAL type。
  3. 所有 packed-date 分支保留全部 temporal 参数的原 Oid,并将所有非 temporal
    参数转换为其矩阵目标字符串类型。这样 JSON + DATE + BIGINTcheckFnretType
    和 executor 重建 resolver 时得到相同的参数类型。
  4. 在纯 JSON 特殊处理之后、任何非 JSON 同 Oid 或混合分支前,先将 ENUM 规范为
    VARCHAR,再识别本函数没有 executor 的 Oid。INTERVAL、GEOMETRY、GEOMETRY32、
    SET 等直接失败;UUID、ROWID、DATALINK、
    array_float32array_float64 仅保留已有 executor 支持的同 Oid 调用。
  5. 首期不扩展通用 JSON -> BLOB/BINARY/VARBINARY cast;因此 JSON 与 binary string
    family 的混合调用直接拒绝,不进入 binary compare 域。
  6. 只要同时存在 date-bearing temporal 和 YEAR,按 date-bearing temporal mixed
    处理;YEAR 保留 temporal Oid,numeric/BIT peer 转字符串,不再进入
    YEAR + numeric/BIT 的 numeric resolver。
条件 resultType / 比较域 cast 与 overload 具体示例
全部为 T_any VARCHAR / 无 NULL 结果,普通 overload GREATEST(NULL, NULL) -> NULL
ENUM 先按 VARCHAR 继续决议 所有 ENUM 参数先 cast 到 VARCHAR GREATEST(enum_col, 'b')ENUM + DATE 继续进入 packed-date 文本解析
全部非 NULL 参数为 JSON VARCHAR / text 全部 JSON cast 为 VARCHAR;普通 overload GREATEST(JSON_EXTRACT('1', '$'), JSON_EXTRACT('2', '$'))
全部非 NULL 参数 Oid 相同、非 JSON,且 executor 支持该 Oid 原类型 / 对应原类型模式;无法表示的 DECIMAL 对齐退回 FLOAT64 DECIMAL、TIME、DATETIME、TIMESTAMP metadata 不同时先对齐;DECIMAL 共同精度超过 76 时全部转 FLOAT64;其余无 cast GREATEST(CAST(1 AS BIGINT), CAST(2 AS BIGINT))GREATEST(CAST(1.5 AS DECIMAL(10,1)), CAST(1.49 AS DECIMAL(12,2))) 先对齐;GREATEST(DECIMAL(76,75) 0.9, DECIMAL(76,0) 1) 转 FLOAT64
存在 executor 不支持的 Oid 拒绝 在任何普通 executor 前拒绝,包括同 Oid GREATEST(INTERVAL '1' DAY, INTERVAL '2' DAY);不能因为同为 INTERVAL 而放行
JSON + date-bearing temporal,且其余仅为 CHAR/VARCHAR、numeric、BIT、TIMEYEAR VARCHAR / packed-date 保留全部 temporal Oid;所有非 temporal 参数 cast 为 VARCHAR;json-temporal overload GREATEST(JSON_EXTRACT('"2020-01-02"', '$'), DATE '2020-01-01')
JSON + TEXT,且无 temporal/binary string TEXT / text 对齐到 TEXT;普通 overload GREATEST(JSON_EXTRACT('"b"', '$'), CAST('a' AS TEXT))
JSON + CHAR/VARCHAR/numeric/BIT/TIME/YEAR,且无 date-bearing temporal/binary string/TEXT VARCHAR / text 对齐到 VARCHAR;普通 overload GREATEST(JSON_EXTRACT('10', '$'), 2);按文本比较 "10""2"
JSON + BLOB/BINARY/VARBINARY 拒绝 不扩展 JSON -> BLOB/BINARY/VARBINARY 通用 cast GREATEST(JSON_EXTRACT('1', '$'), CAST('1' AS BLOB))
其余包含 JSON 的组合 拒绝 不继续匹配普通 temporal/string 行 GREATEST(JSON_EXTRACT('"2020-01-01"', '$'), DATE '2020-01-01', CAST('x' AS TEXT))
全部为 numeric/BIT common numeric type / numeric 全部对齐到共同 numeric 类型;普通 overload GREATEST(CAST(1 AS INT), CAST(2.5 AS DOUBLE)) -> DOUBLE
仅为 DATE/TIME/DATETIME/TIMESTAMP,且至少两种 Oid 混合 DATETIME / packed-date 保留原 Oid;temporal overload;temporalItemType 取最高优先级 GREATEST(DATE '2020-01-01', DATETIME '2020-01-01 12:00:00')
supported temporal + TEXT TEXT / 有 date-bearing temporal 则 packed-date,否则 text packed-date 保留 temporal Oid;否则全部转 TEXT GREATEST(DATE '2020-01-01', CAST('2020-01-02' AS TEXT)) 是 packed-date;GREATEST(TIME '10:00:00', CAST('09:00:00' AS TEXT)) 是 text
supported temporal + CHAR/VARCHAR VARCHAR / 有 date-bearing temporal 则 packed-date,否则 text packed-date 保留 temporal Oid;否则全部转 VARCHAR GREATEST(DATE '2020-01-01', '2020-01-02') 是 packed-date;GREATEST(TIME '10:00:00', '09:00:00') 是 text
supported temporal + BLOB BLOB / 有 date-bearing temporal 则 packed-date,否则 binary packed-date 保留 temporal Oid;否则全部转 BLOB GREATEST(DATE '2020-01-01', CAST('2020-01-02' AS BLOB))
supported temporal + BINARY/VARBINARY VARBINARY / 有 date-bearing temporal 则 packed-date,否则 binary packed-date 保留 temporal Oid;否则全部转 VARBINARY GREATEST(DATE '2020-01-01', CAST('2020-01-02' AS VARBINARY))
date-bearing temporal + numeric/BIT VARCHAR / packed-date 保留 temporal Oid;numeric/BIT 转字符串后按日期解析 GREATEST(DATE '2020-01-01', 20200102)
TIME + numeric/BIT VARCHAR / text 全部对齐到 VARCHAR;temporal overload GREATEST(TIME '10:00:00', 2),比较的是文本 "10:00:00""2"
YEAR + numeric/BIT,且无 date-bearing temporal common numeric type / numeric YEAR 保留原 Oid;其他 peer 转共同 numeric type;year-numeric overload GREATEST(CAST(2020 AS YEAR), 1999)
YEAR + date-bearing temporal VARCHAR / packed-date 保留 temporal Oid;temporal overload GREATEST(CAST(2020 AS YEAR), DATE '2020-01-01')
YEAR + TIME VARCHAR / text 对齐到 VARCHAR;temporal overload GREATEST(CAST(2020 AS YEAR), TIME '10:00:00')
不含 JSON/temporal,存在 TEXT TEXT / text 全部对齐到 TEXT;普通 overload GREATEST(CAST('b' AS TEXT), 2)
不含 JSON/temporal,存在 CHAR/VARCHAR VARCHAR / text 全部对齐到 VARCHAR;普通 overload GREATEST('10', 2) -> '2'
不含 JSON/temporal,存在 BLOB BLOB / binary 全部对齐到 BLOB;普通 overload GREATEST(CAST('61' AS BLOB), 2),按原始字节比较
不含 JSON/temporal,存在 BINARY/VARBINARY VARBINARY / binary 全部对齐到 VARBINARY;普通 overload GREATEST(CAST('a' AS BINARY), 2);提升为 VARBINARY,避免隐式补零
其他组合 拒绝 不扩展本次支持域 GREATEST(UUID_col, DATE_col)

packed temporal 的 temporalItemTypeDATETIME > TIMESTAMP > DATE > TIME > YEAR
选择,独立于 resultType。例如 DATE + TIMEresultTypeDATETIME,但
temporalItemTypeDATE

数字与 nonbinary string 混合按文本比较,例如 '10'2 比较为 '10''2'
JSON 规则在“同 Oid 直接成功”之前,因此 JSON + JSON 也不会让 T_json 进入现有
leastFn / greatestFn 的通用分支。

三个容易混淆的优先级对照:

调用 为什么命中该规则 结果域
GREATEST(CAST(2020 AS YEAR), 1999) 没有 date-bearing temporal,所以 YEAR + numeric 生效 numeric / year-numeric
GREATEST(CAST(2020 AS YEAR), DATE '2020-01-01', 1) DATE 存在,date-bearing temporal 优先,压过 YEAR + numeric packed-date / VARCHAR
GREATEST(TIME '10:00:00', 2) TIME 不是 date-bearing temporal,因此不解析日期 text / VARCHAR
GREATEST(DATE '2020-01-01', 2) DATE 是 date-bearing temporal,因此 2 转字符串后尝试按日期解析 packed-date / VARCHAR
GREATEST(JSON_EXTRACT('1', '$'), CAST('1' AS BLOB)) JSON 已存在,先进入 JSON 子矩阵;binary family 在该子矩阵被拒绝 error

temporal / JSON 处理边界

JSON

  • MatrixOne 已有 JSON -> VARCHAR cast,JSON string 会去掉外层引号,其他 JSON 值
    输出其 JSON 文本表示。需要 JSON 文本输入的矩阵分支复用该转换。这与 MySQL 普通
    JSON item 的 val_str() 不完全相同:MySQL 源码路径使用 JSON serialized text,
    JSON string 会保留外层引号。该差异在本方案中作为已知差异保留。
  • MySQL 的 JSON comparison warning 不实现,也不为此改造 MatrixOne 的 builtin warning
    基础设施。
  • JSON 与日期类 temporal 的局部 cast,以及 INTERVAL、binary string family 等拒绝
    规则均由“优先级矩阵”定义。首期不为本函数新增 JSON -> BLOB/BINARY/VARBINARY
    通用 cast,避免扩大变更面并避免混淆 JSON 文本字节与 MatrixOne 内部 ByteJson 编码。

temporal 混合处理

参考 MySQL 的 Item_func_min_max,非 JSON temporal 混合由
resolveLeastGreatestType() 选择 leastGreatestTemporalFn();JSON 日期混合由
leastGreatestJSONTemporalFn() 选择同一个 packed-date 执行 helper。两种 overload
共享 temporal item 的计算和逐行 packed 比较,但 JSON overload 不从 binder 后的参数
类型重新归并 resultType

运行期逐行比较:非 JSON temporal overload 从 binder 完成局部 cast 后的参数 vector
重建 resolution。json-temporal overload 仅从参数 vector 重建 temporal item 和
packed-date 比较;其返回类型固定为 VARCHAR

  • packed-date 模式下,DATEDATETIMETIMESTAMPTIMEYEAR 都必须能转换为
    packed datetime。DATEDATETIMETIMESTAMP 直接取其 packed 值;TIME 使用
    语句开始时间在会话时区中的日期补齐(与 MySQL time_to_datetime() 一致),不能调用
    使用即时 UTC 日期的通用 Time.ToDatetime()YEAR 转为该年的 1 月 1 日。字符串、JSON
    文本和 binary/BLOB 字节按 temporalItemType 指定的唯一目标类型解析。
  • 无 fallback 约束:resolver 确定 temporalItemType 后,执行器只能调用该类型对应的
    cast/parse;该转换失败立即返回错误,不能继续尝试其他 temporal 类型。例如最高优先级为
    DATE 时,'1' 必须按 DATE 解析并报错,不能在 DATE 失败后改按 TIME 解析为
    00:00:01,更不能补成查询当天的 DATETIME。TIME 解析仅在已选目标为 TIME 时允许。
  • 若最高优先级 temporal item 是 DATEDATETIMETIMESTAMP,按 MySQL
    compare_as_dates() 的 packed-value 比较模型,对本行每个参数取得 packed datetime。
  • 任一参数不能转换为 packed datetime 时,立即返回 MatrixOne 现有 temporal parse 的
    invalid input 错误;不模拟 MySQL 的 warning、解析失败值 0 或原始字符串 fallback。
  • 全部参数成功转换后,直接在 packed 值上选出 LEAST/GREATEST。固定 temporal result
    vector 按 resultType 写入;varlen result vector 按 temporalItemType 格式化输出。
    TIMESTAMP 的转换使用 proc.SessionInfo.TimeZone,与现有 timestamp cast 一致;session
    timezone 缺失时回退 time.Local,不能将 nil location 传给 timestamp 转换。
  • 若模式不是 packed-date,按 resolver 返回的 numeric、text 或 binary 模式复用相应
    executor;TIMEYEAR 不被错误地提升为 DATETIME

范围约束

只覆盖 DATEDATETIMETIMESTAMPTIMEYEAR 和按 VARCHAR 处理的 ENUM
不覆盖 INTERVALSETGEOMETRY 等 MySQL 类型矩阵项。字符集/collation 的完整行为仍保持首期
限制。

首期不支持

  • 完整 charset/collation。现有 MatrixOne varlen 执行器使用 bytes.Compare,首期
    只保证 ASCII 文本和原始字节场景。

已知差异

  • 按本方案实现后,主流 numeric/string 混合、纯 numeric、纯 string、常见 temporal
    路径会接近 MySQL 行为;JSON 文本比较只保证复用 MatrixOne 当前 JSON -> VARCHAR
    语义,不保证逐项复刻 MySQL 的 JSON serialized text 语义。差异主要集中在 JSON string、
    边缘类型组合、错误处理、charset/collation 和返回 metadata。
  • MySQL 对固定 BINARY 的返回元数据可能保留固定 binary 类型;本方案把混合
    BINARY + numeric 提升为 VARBINARY。这是有意的值语义优先:MatrixOne 若 cast
    到固定 BINARY 会补 0x00 并改变短值。该 Medium 不在本次解决范围。
  • binary 转非二进制 string 时,MySQL 可按 charset/collation 报转换错误;MatrixOne
    当前不能完全复现。这属于完整 collation 支持,不在本次范围。
  • JSON 转字符串时缺少 MySQL warning;本次只对结果值和错误路径对齐。
  • JSON string 转字符串时,MatrixOne 当前 JSON -> VARCHAR 会去掉外层引号;MySQL
    普通 JSON item 的 val_str() 使用 JSON serialized text,JSON string 会保留外层引号。
    因此 greatest(json_extract('{"a":"2"}', '$.a'), '10') 这类 JSON string 与普通
    string 混合比较,可能与 MySQL 不一致。首期不为 GREATEST/LEAST 新增独立 JSON
    serialized text cast 路径。
  • JSON + BLOB/BINARY/VARBINARY 当前拒绝。MySQL 可通过 field_type_merge 进入
    binary string 域;MatrixOne 当前 JSON cast 不支持 binary family,本次不扩展通用
    cast。
  • JSON + 日期类 temporal 与 TEXTBLOBBINARY/VARBINARY 的多域组合当前拒绝。
    MySQL 可继续通过 field-type merge 支持这些组合;本次为避免 JSON-temporal 的返回类型、
    text 域和 binary 域同时分叉而明确不覆盖。
  • 无 date-bearing temporal 参与时,YEAR + numeric/BIT 通过函数专用 year-numeric
    overload 将 YEAR 作为四位无符号 numeric source 归并,以保证值范围;返回类型不保证
    逐项复刻 MySQL field_type_merge 对 YEAR 的元数据。若同时存在 date-bearing temporal,
    则按 packed-date 规则处理,不走该 numeric 分支。
  • temporal 的输入解析复用 MatrixOne 的 ParseDateCastParseDatetimeParseTime
    ParseTimestamp;其宽松格式、零日期和 warning 行为仍可能与 MySQL 不同。无效
    日期在本函数中直接返回 invalid input,不实现 MySQL 的 warning/packed-0/
    字符串 fallback 语义。
  • MySQL 字符串比较受 charset/collation 影响;MatrixOne 首期 varlen 比较使用
    bytes.Compare。ASCII 普通字符串基本可对齐,非 ASCII、大小写不敏感 collation 和特殊
    排序规则可能不同。
  • MySQL 的 LONG_BLOB、固定 BINARY、charset/collation 等返回 metadata 不逐项复刻;
    MatrixOne 使用 BLOBVARBINARYVARCHARTEXT 等近似类型,值语义优先。

行为差异评估

首期目标覆盖下列 MySQL 兼容核心路径,预期与 MySQL 行为差异不大:

greatest('10', 2);        -- 按字符串比较
least('10', 2);
greatest(10, 2);          -- 按数字比较
greatest('10', '2');      -- 按字符串比较
greatest(date_col, varchar_col);  -- varchar 可转日期时按 packed temporal 比较
greatest(json_col, varchar_col);  -- 复用 MatrixOne 当前 JSON -> VARCHAR 语义后比较
greatest(json_col, date_col);     -- JSON 文本可转日期时按 temporal 比较

不追求完全复刻 MySQL 的路径:

greatest(json_col, cast('x' as binary)); -- MatrixOne 首期拒绝
greatest(json_col, blob_col);            -- MatrixOne 首期拒绝
greatest(cast('2020-01-01' as date), 'not-a-date'); -- MatrixOne 返回 invalid input

因此,如果目标是修复普通 numeric/string 混合、常见 temporal、MatrixOne 现有 JSON
文本转换语义下的比较,方案与 MySQL 的行为差异可控;如果目标是完整复刻 MySQL 全类型
矩阵、JSON serialized text、collation、warning/fallback 和结果 metadata,则还需要更大
范围改造。

@qodo-code-review

Copy link
Copy Markdown

Qodo reviews are paused for this user.

Troubleshooting steps vary by plan Learn more →

On a Teams plan?
Reviews resume once this user has a paid seat and their Git account is linked in Qodo.
Link Git account →

Using GitHub Enterprise Server, GitLab Self-Managed, or Bitbucket Data Center?
These require an Enterprise plan - Contact us
Contact us →

@XuPeng-SH XuPeng-SH left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Request changes: the mixed-temporal resolver is not permutation-invariant and can return a wrong value.

[P1] Preserve fractional-second precision when resolving mixed temporal Oids

leastGreatestTemporalItemType replaces the selected type only when rank > bestRank, so two DATETIME (or TIMESTAMP) inputs with different scales keep whichever one appears first. In addition, the all-temporal branch returns a default DATETIME(0). This is not only a metadata issue: varlen peers are parsed and formatted with temporalItemType.Scale, so an earlier low-scale operand rounds a later string before comparison and can change the winner.

A focused reproduction at this head:

DATETIME(1) '2020-01-01 00:00:00.1',
DATETIME(2) '2020-01-01 00:00:00.24',
VARCHAR     '2020-01-01 00:00:00.25'

GREATEST returns 2020-01-01 00:00:00.3, while the expected value is 2020-01-01 00:00:00.25. Reordering equal-rank temporal operands changes the behavior. Separately, DATE + DATETIME(1) + DATETIME(6) resolves to DATETIME(0) and selects a scale-1 temporal item instead of preserving scale 6.

Please derive temporal metadata across the complete temporal input set (including max FSP for the chosen packed/common type) rather than keeping the first equal-rank type, and carry that scale into the all-temporal result type. Add permutation tests for both LEAST/GREATEST covering mixed Oids, same-rank different scales, string/JSON peers, binder return metadata, and executor values.

I also audited null/error cleanup, select-list paths, bounded allocations, and wait/ownership behavior; I did not find a separate leak, hang, or unbounded-growth blocker. The focused tests already in the PR pass, but they cover same-Oid scale alignment and therefore miss this mixed-Oid path.

@XuPeng-SH XuPeng-SH left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Requesting changes: one blocking performance issue remains.

[P1] Hoist temporal vector accessors out of the row loop (pkg/sql/plan/function/func_builtin_leastgreatest.go:1060-1081). leastGreatestDatetimeValue is called from the inner row × argument loop, but every fixed temporal case calls vector.GenerateFunctionFixedTypeParameter again. Those helpers return wrapper objects, so this turns a column scan into allocation work per cell. On this exact head, an independent testing.AllocsPerRun probe with 8,192 rows and two fixed temporal arguments measured 16,385 allocations per execution (approximately one allocation per argument per row). A million-row two-argument GREATEST/LEAST therefore creates roughly two million short-lived objects, causing avoidable GC and memory pressure.

Please build/reuse the typed readers once per parameter before iterating rows (or use another batch-scoped accessor representation), keep the per-row fixed-temporal path allocation-free, and add a benchmark/allocation regression showing allocations scale with the argument count per batch rather than rows × arguments.

The previous mixed-temporal FSP/permutation issue is fixed: resolution now scans the complete temporal set for max scale, and the binder, constant-fold, executor, NULL/select-list, and permutation tests pass. I also re-ran the full pkg/sql/plan/function suite, focused pkg/sql/plan tests, and focused race tests successfully. The Q1-Q3 unhappy-path audit found no separate retained-resource leak, blocking/wait cycle, or unbounded retained-growth issue.

@daviszhen

Copy link
Copy Markdown
Contributor Author

Requesting changes: one blocking performance issue remains.

[P1] Hoist temporal vector accessors out of the row loop (pkg/sql/plan/function/func_builtin_leastgreatest.go:1060-1081). leastGreatestDatetimeValue is called from the inner row × argument loop, but every fixed temporal case calls vector.GenerateFunctionFixedTypeParameter again. Those helpers return wrapper objects, so this turns a column scan into allocation work per cell. On this exact head, an independent testing.AllocsPerRun probe with 8,192 rows and two fixed temporal arguments measured 16,385 allocations per execution (approximately one allocation per argument per row). A million-row two-argument GREATEST/LEAST therefore creates roughly two million short-lived objects, causing avoidable GC and memory pressure.

Please build/reuse the typed readers once per parameter before iterating rows (or use another batch-scoped accessor representation), keep the per-row fixed-temporal path allocation-free, and add a benchmark/allocation regression showing allocations scale with the argument count per batch rather than rows × arguments.

The previous mixed-temporal FSP/permutation issue is fixed: resolution now scans the complete temporal set for max scale, and the binder, constant-fold, executor, NULL/select-list, and permutation tests pass. I also re-ran the full pkg/sql/plan/function suite, focused pkg/sql/plan tests, and focused race tests successfully. The Q1-Q3 unhappy-path audit found no separate retained-resource leak, blocking/wait cycle, or unbounded retained-growth issue.

Requesting changes: one blocking performance issue remains.

[P1] Hoist temporal vector accessors out of the row loop (pkg/sql/plan/function/func_builtin_leastgreatest.go:1060-1081). leastGreatestDatetimeValue is called from the inner row × argument loop, but every fixed temporal case calls vector.GenerateFunctionFixedTypeParameter again. Those helpers return wrapper objects, so this turns a column scan into allocation work per cell. On this exact head, an independent testing.AllocsPerRun probe with 8,192 rows and two fixed temporal arguments measured 16,385 allocations per execution (approximately one allocation per argument per row). A million-row two-argument GREATEST/LEAST therefore creates roughly two million short-lived objects, causing avoidable GC and memory pressure.

Please build/reuse the typed readers once per parameter before iterating rows (or use another batch-scoped accessor representation), keep the per-row fixed-temporal path allocation-free, and add a benchmark/allocation regression showing allocations scale with the argument count per batch rather than rows × arguments.

The previous mixed-temporal FSP/permutation issue is fixed: resolution now scans the complete temporal set for max scale, and the binder, constant-fold, executor, NULL/select-list, and permutation tests pass. I also re-ran the full pkg/sql/plan/function suite, focused pkg/sql/plan tests, and focused race tests successfully. The Q1-Q3 unhappy-path audit found no separate retained-resource leak, blocking/wait cycle, or unbounded retained-growth issue.

已经修改

@daviszhen
daviszhen requested a review from XuPeng-SH July 17, 2026 07:38

@XuPeng-SH XuPeng-SH left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Approved on exact head 2ff064429de94a5c84dee712a1fbdd7292ddb060.

The two previously blocking issues are closed:

  • Mixed-temporal resolution now derives maximum fractional-second precision from the complete temporal input set, preserving binder/executor metadata and permutation invariance.
  • Fixed temporal vector readers are constructed once per argument per batch rather than in the row × argument loop. The added allocation regression covers row scaling; an independent 8,192-row benchmark on this head measured 400 B/op and 4 allocs/op.

I re-audited resolver/executor symmetry, NULL and select-list behavior, numeric/string/binary precedence, JSON/temporal/YEAR dispatch, invalid-type rejection, result metadata, ownership, and bounded-growth behavior. No remaining correctness, leak, hang, or unbounded-allocation blocker was found.

Local verification passed: full pkg/sql/plan/function, focused binder/constant-fold tests in pkg/sql/plan, focused race tests, go vet for both packages, and the temporal benchmark. CI is green.

Non-blocking hygiene: test/distributed/cases/function/builtin.result contains a large unrelated output-format refresh and four trailing-whitespace lines; cleaning that separately would reduce diff noise and future conflicts.

@mergify mergify Bot added the queued label Jul 17, 2026
@mergify

mergify Bot commented Jul 17, 2026

Copy link
Copy Markdown
Contributor

Merge Queue Status

  • Entered queue2026-07-17 13:20 UTC · Rule: main · triggered by rule Automatic queue on approval for main
  • 🟠 Checks running · in-place · dashboard
  • ⏳ Merge · ETA: 2026-07-17 14:27 UTC 🚀
Waiting for
  • any of: [🛡 GitHub branch protection]
    • check-neutral = Matrixone Compose CI / multi cn e2e bvt test docker compose(PESSIMISTIC)
    • check-skipped = Matrixone Compose CI / multi cn e2e bvt test docker compose(PESSIMISTIC)
    • check-success = Matrixone Compose CI / multi cn e2e bvt test docker compose(PESSIMISTIC)
  • any of: [🛡 GitHub branch protection]
    • check-neutral = Matrixone Standlone CI / Multi-CN e2e BVT Test on Linux/x64(LAUNCH, PROXY)
    • check-skipped = Matrixone Standlone CI / Multi-CN e2e BVT Test on Linux/x64(LAUNCH, PROXY)
    • check-success = Matrixone Standlone CI / Multi-CN e2e BVT Test on Linux/x64(LAUNCH, PROXY)
  • any of: [🛡 GitHub branch protection]
    • check-neutral = Matrixone Standlone CI / e2e BVT Test on Linux/x64(LAUNCH, PESSIMISTIC)
    • check-skipped = Matrixone Standlone CI / e2e BVT Test on Linux/x64(LAUNCH, PESSIMISTIC)
    • check-success = Matrixone Standlone CI / e2e BVT Test on Linux/x64(LAUNCH, PESSIMISTIC)
  • any of: [🛡 GitHub branch protection]
    • check-neutral = Matrixone CI / UT Test on Ubuntu/x86
    • check-skipped = Matrixone CI / UT Test on Ubuntu/x86
    • check-success = Matrixone CI / UT Test on Ubuntu/x86
  • any of: [🛡 GitHub branch protection]
    • check-neutral = Matrixone Utils CI / Coverage
    • check-skipped = Matrixone Utils CI / Coverage
    • check-success = Matrixone Utils CI / Coverage
All merge conditions
  • any of [🛡 GitHub branch protection]:
    • check-neutral = Matrixone Compose CI / multi cn e2e bvt test docker compose(PESSIMISTIC)
    • check-skipped = Matrixone Compose CI / multi cn e2e bvt test docker compose(PESSIMISTIC)
    • check-success = Matrixone Compose CI / multi cn e2e bvt test docker compose(PESSIMISTIC)
  • any of [🛡 GitHub branch protection]:
    • check-neutral = Matrixone Standlone CI / Multi-CN e2e BVT Test on Linux/x64(LAUNCH, PROXY)
    • check-skipped = Matrixone Standlone CI / Multi-CN e2e BVT Test on Linux/x64(LAUNCH, PROXY)
    • check-success = Matrixone Standlone CI / Multi-CN e2e BVT Test on Linux/x64(LAUNCH, PROXY)
  • any of [🛡 GitHub branch protection]:
    • check-neutral = Matrixone Standlone CI / e2e BVT Test on Linux/x64(LAUNCH, PESSIMISTIC)
    • check-skipped = Matrixone Standlone CI / e2e BVT Test on Linux/x64(LAUNCH, PESSIMISTIC)
    • check-success = Matrixone Standlone CI / e2e BVT Test on Linux/x64(LAUNCH, PESSIMISTIC)
  • any of [🛡 GitHub branch protection]:
    • check-neutral = Matrixone CI / UT Test on Ubuntu/x86
    • check-skipped = Matrixone CI / UT Test on Ubuntu/x86
    • check-success = Matrixone CI / UT Test on Ubuntu/x86
  • any of [🛡 GitHub branch protection]:
    • check-neutral = Matrixone Utils CI / Coverage
    • check-skipped = Matrixone Utils CI / Coverage
    • check-success = Matrixone Utils CI / Coverage
  • #review-threads-unresolved = 0 [🛡 GitHub branch protection]
  • github-review-approved [🛡 GitHub branch protection] (documentation)
  • github-review-decision = APPROVED [🛡 GitHub branch protection] (documentation)
  • any of [🛡 GitHub branch protection]:
    • check-success = Matrixone CI / SCA Test on Linux/arm64
    • check-neutral = Matrixone CI / SCA Test on Linux/arm64
    • check-skipped = Matrixone CI / SCA Test on Linux/arm64
Waiting for any of
  • all of: [📌 queue conditions of queue rule main]
    • any of: [🛡 GitHub branch protection]
      • check-neutral = Matrixone Compose CI / multi cn e2e bvt test docker compose(PESSIMISTIC)
      • check-skipped = Matrixone Compose CI / multi cn e2e bvt test docker compose(PESSIMISTIC)
      • check-success = Matrixone Compose CI / multi cn e2e bvt test docker compose(PESSIMISTIC)
    • any of: [🛡 GitHub branch protection]
      • check-neutral = Matrixone Standlone CI / Multi-CN e2e BVT Test on Linux/x64(LAUNCH, PROXY)
      • check-skipped = Matrixone Standlone CI / Multi-CN e2e BVT Test on Linux/x64(LAUNCH, PROXY)
      • check-success = Matrixone Standlone CI / Multi-CN e2e BVT Test on Linux/x64(LAUNCH, PROXY)
    • any of: [🛡 GitHub branch protection]
      • check-neutral = Matrixone Standlone CI / e2e BVT Test on Linux/x64(LAUNCH, PESSIMISTIC)
      • check-skipped = Matrixone Standlone CI / e2e BVT Test on Linux/x64(LAUNCH, PESSIMISTIC)
      • check-success = Matrixone Standlone CI / e2e BVT Test on Linux/x64(LAUNCH, PESSIMISTIC)
    • any of: [🛡 GitHub branch protection]
      • check-neutral = Matrixone CI / UT Test on Ubuntu/x86
      • check-skipped = Matrixone CI / UT Test on Ubuntu/x86
      • check-success = Matrixone CI / UT Test on Ubuntu/x86
    • any of: [🛡 GitHub branch protection]
      • check-neutral = Matrixone Utils CI / Coverage
      • check-skipped = Matrixone Utils CI / Coverage
      • check-success = Matrixone Utils CI / Coverage
  • all of: [📌 queue conditions of queue rule release-2.1]
    • any of: [🛡 GitHub branch protection]
      • check-neutral = Matrixone Compose CI / multi cn e2e bvt test docker compose(PESSIMISTIC)
      • check-skipped = Matrixone Compose CI / multi cn e2e bvt test docker compose(PESSIMISTIC)
      • check-success = Matrixone Compose CI / multi cn e2e bvt test docker compose(PESSIMISTIC)
    • any of: [🛡 GitHub branch protection]
      • check-neutral = Matrixone Standlone CI / Multi-CN e2e BVT Test on Linux/x64(LAUNCH, PROXY)
      • check-skipped = Matrixone Standlone CI / Multi-CN e2e BVT Test on Linux/x64(LAUNCH, PROXY)
      • check-success = Matrixone Standlone CI / Multi-CN e2e BVT Test on Linux/x64(LAUNCH, PROXY)
    • any of: [🛡 GitHub branch protection]
      • check-neutral = Matrixone Standlone CI / e2e BVT Test on Linux/x64(LAUNCH, PESSIMISTIC)
      • check-skipped = Matrixone Standlone CI / e2e BVT Test on Linux/x64(LAUNCH, PESSIMISTIC)
      • check-success = Matrixone Standlone CI / e2e BVT Test on Linux/x64(LAUNCH, PESSIMISTIC)
    • any of: [🛡 GitHub branch protection]
      • check-neutral = Matrixone CI / UT Test on Ubuntu/x86
      • check-skipped = Matrixone CI / UT Test on Ubuntu/x86
      • check-success = Matrixone CI / UT Test on Ubuntu/x86
    • any of: [🛡 GitHub branch protection]
      • check-neutral = Matrixone Utils CI / Coverage
      • check-skipped = Matrixone Utils CI / Coverage
      • check-success = Matrixone Utils CI / Coverage
  • all of: [📌 queue conditions of queue rule release-2.2]
    • any of: [🛡 GitHub branch protection]
      • check-neutral = Matrixone Compose CI / multi cn e2e bvt test docker compose(PESSIMISTIC)
      • check-skipped = Matrixone Compose CI / multi cn e2e bvt test docker compose(PESSIMISTIC)
      • check-success = Matrixone Compose CI / multi cn e2e bvt test docker compose(PESSIMISTIC)
    • any of: [🛡 GitHub branch protection]
      • check-neutral = Matrixone Standlone CI / Multi-CN e2e BVT Test on Linux/x64(LAUNCH, PROXY)
      • check-skipped = Matrixone Standlone CI / Multi-CN e2e BVT Test on Linux/x64(LAUNCH, PROXY)
      • check-success = Matrixone Standlone CI / Multi-CN e2e BVT Test on Linux/x64(LAUNCH, PROXY)
    • any of: [🛡 GitHub branch protection]
      • check-neutral = Matrixone Standlone CI / e2e BVT Test on Linux/x64(LAUNCH, PESSIMISTIC)
      • check-skipped = Matrixone Standlone CI / e2e BVT Test on Linux/x64(LAUNCH, PESSIMISTIC)
      • check-success = Matrixone Standlone CI / e2e BVT Test on Linux/x64(LAUNCH, PESSIMISTIC)
    • any of: [🛡 GitHub branch protection]
      • check-neutral = Matrixone CI / UT Test on Ubuntu/x86
      • check-skipped = Matrixone CI / UT Test on Ubuntu/x86
      • check-success = Matrixone CI / UT Test on Ubuntu/x86
    • any of: [🛡 GitHub branch protection]
      • check-neutral = Matrixone Utils CI / Coverage
      • check-skipped = Matrixone Utils CI / Coverage
      • check-success = Matrixone Utils CI / Coverage
  • all of: [📌 queue conditions of queue rule release-3.0]
    • any of: [🛡 GitHub branch protection]
      • check-neutral = Matrixone Compose CI / multi cn e2e bvt test docker compose(PESSIMISTIC)
      • check-skipped = Matrixone Compose CI / multi cn e2e bvt test docker compose(PESSIMISTIC)
      • check-success = Matrixone Compose CI / multi cn e2e bvt test docker compose(PESSIMISTIC)
    • any of: [🛡 GitHub branch protection]
      • check-neutral = Matrixone Standlone CI / Multi-CN e2e BVT Test on Linux/x64(LAUNCH, PROXY)
      • check-skipped = Matrixone Standlone CI / Multi-CN e2e BVT Test on Linux/x64(LAUNCH, PROXY)
      • check-success = Matrixone Standlone CI / Multi-CN e2e BVT Test on Linux/x64(LAUNCH, PROXY)
    • any of: [🛡 GitHub branch protection]
      • check-neutral = Matrixone Standlone CI / e2e BVT Test on Linux/x64(LAUNCH, PESSIMISTIC)
      • check-skipped = Matrixone Standlone CI / e2e BVT Test on Linux/x64(LAUNCH, PESSIMISTIC)
      • check-success = Matrixone Standlone CI / e2e BVT Test on Linux/x64(LAUNCH, PESSIMISTIC)
    • any of: [🛡 GitHub branch protection]
      • check-neutral = Matrixone CI / UT Test on Ubuntu/x86
      • check-skipped = Matrixone CI / UT Test on Ubuntu/x86
      • check-success = Matrixone CI / UT Test on Ubuntu/x86
    • any of: [🛡 GitHub branch protection]
      • check-neutral = Matrixone Utils CI / Coverage
      • check-skipped = Matrixone Utils CI / Coverage
      • check-success = Matrixone Utils CI / Coverage
  • all of: [📌 queue conditions of queue rule release-4.0]
    • any of: [🛡 GitHub branch protection]
      • check-neutral = Matrixone Compose CI / multi cn e2e bvt test docker compose(PESSIMISTIC)
      • check-skipped = Matrixone Compose CI / multi cn e2e bvt test docker compose(PESSIMISTIC)
      • check-success = Matrixone Compose CI / multi cn e2e bvt test docker compose(PESSIMISTIC)
    • any of: [🛡 GitHub branch protection]
      • check-neutral = Matrixone Standlone CI / Multi-CN e2e BVT Test on Linux/x64(LAUNCH, PROXY)
      • check-skipped = Matrixone Standlone CI / Multi-CN e2e BVT Test on Linux/x64(LAUNCH, PROXY)
      • check-success = Matrixone Standlone CI / Multi-CN e2e BVT Test on Linux/x64(LAUNCH, PROXY)
    • any of: [🛡 GitHub branch protection]
      • check-neutral = Matrixone Standlone CI / e2e BVT Test on Linux/x64(LAUNCH, PESSIMISTIC)
      • check-skipped = Matrixone Standlone CI / e2e BVT Test on Linux/x64(LAUNCH, PESSIMISTIC)
      • check-success = Matrixone Standlone CI / e2e BVT Test on Linux/x64(LAUNCH, PESSIMISTIC)
    • any of: [🛡 GitHub branch protection]
      • check-neutral = Matrixone CI / UT Test on Ubuntu/x86
      • check-skipped = Matrixone CI / UT Test on Ubuntu/x86
      • check-success = Matrixone CI / UT Test on Ubuntu/x86
    • any of: [🛡 GitHub branch protection]
      • check-neutral = Matrixone Utils CI / Coverage
      • check-skipped = Matrixone Utils CI / Coverage
      • check-success = Matrixone Utils CI / Coverage
  • all of: [📌 queue conditions of queue rule release-4.1]
    • any of: [🛡 GitHub branch protection]
      • check-neutral = Matrixone Compose CI / multi cn e2e bvt test docker compose(PESSIMISTIC)
      • check-skipped = Matrixone Compose CI / multi cn e2e bvt test docker compose(PESSIMISTIC)
      • check-success = Matrixone Compose CI / multi cn e2e bvt test docker compose(PESSIMISTIC)
    • any of: [🛡 GitHub branch protection]
      • check-neutral = Matrixone Standlone CI / Multi-CN e2e BVT Test on Linux/x64(LAUNCH, PROXY)
      • check-skipped = Matrixone Standlone CI / Multi-CN e2e BVT Test on Linux/x64(LAUNCH, PROXY)
      • check-success = Matrixone Standlone CI / Multi-CN e2e BVT Test on Linux/x64(LAUNCH, PROXY)
    • any of: [🛡 GitHub branch protection]
      • check-neutral = Matrixone Standlone CI / e2e BVT Test on Linux/x64(LAUNCH, PESSIMISTIC)
      • check-skipped = Matrixone Standlone CI / e2e BVT Test on Linux/x64(LAUNCH, PESSIMISTIC)
      • check-success = Matrixone Standlone CI / e2e BVT Test on Linux/x64(LAUNCH, PESSIMISTIC)
    • any of: [🛡 GitHub branch protection]
      • check-neutral = Matrixone CI / UT Test on Ubuntu/x86
      • check-skipped = Matrixone CI / UT Test on Ubuntu/x86
      • check-success = Matrixone CI / UT Test on Ubuntu/x86
    • any of: [🛡 GitHub branch protection]
      • check-neutral = Matrixone Utils CI / Coverage
      • check-skipped = Matrixone Utils CI / Coverage
      • check-success = Matrixone Utils CI / Coverage
All queue conditions
  • any of [🔀 queue conditions]:
    • all of [📌 queue conditions of queue rule main]:
      • any of [🛡 GitHub branch protection]:
        • check-neutral = Matrixone Compose CI / multi cn e2e bvt test docker compose(PESSIMISTIC)
        • check-skipped = Matrixone Compose CI / multi cn e2e bvt test docker compose(PESSIMISTIC)
        • check-success = Matrixone Compose CI / multi cn e2e bvt test docker compose(PESSIMISTIC)
      • any of [🛡 GitHub branch protection]:
        • check-neutral = Matrixone Standlone CI / Multi-CN e2e BVT Test on Linux/x64(LAUNCH, PROXY)
        • check-skipped = Matrixone Standlone CI / Multi-CN e2e BVT Test on Linux/x64(LAUNCH, PROXY)
        • check-success = Matrixone Standlone CI / Multi-CN e2e BVT Test on Linux/x64(LAUNCH, PROXY)
      • any of [🛡 GitHub branch protection]:
        • check-neutral = Matrixone Standlone CI / e2e BVT Test on Linux/x64(LAUNCH, PESSIMISTIC)
        • check-skipped = Matrixone Standlone CI / e2e BVT Test on Linux/x64(LAUNCH, PESSIMISTIC)
        • check-success = Matrixone Standlone CI / e2e BVT Test on Linux/x64(LAUNCH, PESSIMISTIC)
      • any of [🛡 GitHub branch protection]:
        • check-neutral = Matrixone CI / UT Test on Ubuntu/x86
        • check-skipped = Matrixone CI / UT Test on Ubuntu/x86
        • check-success = Matrixone CI / UT Test on Ubuntu/x86
      • any of [🛡 GitHub branch protection]:
        • check-neutral = Matrixone Utils CI / Coverage
        • check-skipped = Matrixone Utils CI / Coverage
        • check-success = Matrixone Utils CI / Coverage
      • #review-threads-unresolved = 0 [🛡 GitHub branch protection]
      • github-review-approved [🛡 GitHub branch protection] (documentation)
      • github-review-decision = APPROVED [🛡 GitHub branch protection] (documentation)
      • any of [🛡 GitHub branch protection]:
        • check-success = Matrixone CI / SCA Test on Linux/arm64
        • check-neutral = Matrixone CI / SCA Test on Linux/arm64
        • check-skipped = Matrixone CI / SCA Test on Linux/arm64
    • all of [📌 queue conditions of queue rule release-2.1]:
      • any of [🛡 GitHub branch protection]:
        • check-neutral = Matrixone Compose CI / multi cn e2e bvt test docker compose(PESSIMISTIC)
        • check-skipped = Matrixone Compose CI / multi cn e2e bvt test docker compose(PESSIMISTIC)
        • check-success = Matrixone Compose CI / multi cn e2e bvt test docker compose(PESSIMISTIC)
      • any of [🛡 GitHub branch protection]:
        • check-neutral = Matrixone Standlone CI / Multi-CN e2e BVT Test on Linux/x64(LAUNCH, PROXY)
        • check-skipped = Matrixone Standlone CI / Multi-CN e2e BVT Test on Linux/x64(LAUNCH, PROXY)
        • check-success = Matrixone Standlone CI / Multi-CN e2e BVT Test on Linux/x64(LAUNCH, PROXY)
      • any of [🛡 GitHub branch protection]:
        • check-neutral = Matrixone Standlone CI / e2e BVT Test on Linux/x64(LAUNCH, PESSIMISTIC)
        • check-skipped = Matrixone Standlone CI / e2e BVT Test on Linux/x64(LAUNCH, PESSIMISTIC)
        • check-success = Matrixone Standlone CI / e2e BVT Test on Linux/x64(LAUNCH, PESSIMISTIC)
      • any of [🛡 GitHub branch protection]:
        • check-neutral = Matrixone CI / UT Test on Ubuntu/x86
        • check-skipped = Matrixone CI / UT Test on Ubuntu/x86
        • check-success = Matrixone CI / UT Test on Ubuntu/x86
      • any of [🛡 GitHub branch protection]:
        • check-neutral = Matrixone Utils CI / Coverage
        • check-skipped = Matrixone Utils CI / Coverage
        • check-success = Matrixone Utils CI / Coverage
      • #review-threads-unresolved = 0 [🛡 GitHub branch protection]
      • github-review-approved [🛡 GitHub branch protection] (documentation)
      • github-review-decision = APPROVED [🛡 GitHub branch protection] (documentation)
      • any of [🛡 GitHub branch protection]:
        • check-success = Matrixone CI / SCA Test on Linux/arm64
        • check-neutral = Matrixone CI / SCA Test on Linux/arm64
        • check-skipped = Matrixone CI / SCA Test on Linux/arm64
    • all of [📌 queue conditions of queue rule release-2.2]:
      • any of [🛡 GitHub branch protection]:
        • check-neutral = Matrixone Compose CI / multi cn e2e bvt test docker compose(PESSIMISTIC)
        • check-skipped = Matrixone Compose CI / multi cn e2e bvt test docker compose(PESSIMISTIC)
        • check-success = Matrixone Compose CI / multi cn e2e bvt test docker compose(PESSIMISTIC)
      • any of [🛡 GitHub branch protection]:
        • check-neutral = Matrixone Standlone CI / Multi-CN e2e BVT Test on Linux/x64(LAUNCH, PROXY)
        • check-skipped = Matrixone Standlone CI / Multi-CN e2e BVT Test on Linux/x64(LAUNCH, PROXY)
        • check-success = Matrixone Standlone CI / Multi-CN e2e BVT Test on Linux/x64(LAUNCH, PROXY)
      • any of [🛡 GitHub branch protection]:
        • check-neutral = Matrixone Standlone CI / e2e BVT Test on Linux/x64(LAUNCH, PESSIMISTIC)
        • check-skipped = Matrixone Standlone CI / e2e BVT Test on Linux/x64(LAUNCH, PESSIMISTIC)
        • check-success = Matrixone Standlone CI / e2e BVT Test on Linux/x64(LAUNCH, PESSIMISTIC)
      • any of [🛡 GitHub branch protection]:
        • check-neutral = Matrixone CI / UT Test on Ubuntu/x86
        • check-skipped = Matrixone CI / UT Test on Ubuntu/x86
        • check-success = Matrixone CI / UT Test on Ubuntu/x86
      • any of [🛡 GitHub branch protection]:
        • check-neutral = Matrixone Utils CI / Coverage
        • check-skipped = Matrixone Utils CI / Coverage
        • check-success = Matrixone Utils CI / Coverage
      • #review-threads-unresolved = 0 [🛡 GitHub branch protection]
      • github-review-approved [🛡 GitHub branch protection] (documentation)
      • github-review-decision = APPROVED [🛡 GitHub branch protection] (documentation)
      • any of [🛡 GitHub branch protection]:
        • check-success = Matrixone CI / SCA Test on Linux/arm64
        • check-neutral = Matrixone CI / SCA Test on Linux/arm64
        • check-skipped = Matrixone CI / SCA Test on Linux/arm64
    • all of [📌 queue conditions of queue rule release-3.0]:
      • any of [🛡 GitHub branch protection]:
        • check-neutral = Matrixone Compose CI / multi cn e2e bvt test docker compose(PESSIMISTIC)
        • check-skipped = Matrixone Compose CI / multi cn e2e bvt test docker compose(PESSIMISTIC)
        • check-success = Matrixone Compose CI / multi cn e2e bvt test docker compose(PESSIMISTIC)
      • any of [🛡 GitHub branch protection]:
        • check-neutral = Matrixone Standlone CI / Multi-CN e2e BVT Test on Linux/x64(LAUNCH, PROXY)
        • check-skipped = Matrixone Standlone CI / Multi-CN e2e BVT Test on Linux/x64(LAUNCH, PROXY)
        • check-success = Matrixone Standlone CI / Multi-CN e2e BVT Test on Linux/x64(LAUNCH, PROXY)
      • any of [🛡 GitHub branch protection]:
        • check-neutral = Matrixone Standlone CI / e2e BVT Test on Linux/x64(LAUNCH, PESSIMISTIC)
        • check-skipped = Matrixone Standlone CI / e2e BVT Test on Linux/x64(LAUNCH, PESSIMISTIC)
        • check-success = Matrixone Standlone CI / e2e BVT Test on Linux/x64(LAUNCH, PESSIMISTIC)
      • any of [🛡 GitHub branch protection]:
        • check-neutral = Matrixone CI / UT Test on Ubuntu/x86
        • check-skipped = Matrixone CI / UT Test on Ubuntu/x86
        • check-success = Matrixone CI / UT Test on Ubuntu/x86
      • any of [🛡 GitHub branch protection]:
        • check-neutral = Matrixone Utils CI / Coverage
        • check-skipped = Matrixone Utils CI / Coverage
        • check-success = Matrixone Utils CI / Coverage
      • #review-threads-unresolved = 0 [🛡 GitHub branch protection]
      • github-review-approved [🛡 GitHub branch protection] (documentation)
      • github-review-decision = APPROVED [🛡 GitHub branch protection] (documentation)
      • any of [🛡 GitHub branch protection]:
        • check-success = Matrixone CI / SCA Test on Linux/arm64
        • check-neutral = Matrixone CI / SCA Test on Linux/arm64
        • check-skipped = Matrixone CI / SCA Test on Linux/arm64
    • all of [📌 queue conditions of queue rule release-4.0]:
      • any of [🛡 GitHub branch protection]:
        • check-neutral = Matrixone Compose CI / multi cn e2e bvt test docker compose(PESSIMISTIC)
        • check-skipped = Matrixone Compose CI / multi cn e2e bvt test docker compose(PESSIMISTIC)
        • check-success = Matrixone Compose CI / multi cn e2e bvt test docker compose(PESSIMISTIC)
      • any of [🛡 GitHub branch protection]:
        • check-neutral = Matrixone Standlone CI / Multi-CN e2e BVT Test on Linux/x64(LAUNCH, PROXY)
        • check-skipped = Matrixone Standlone CI / Multi-CN e2e BVT Test on Linux/x64(LAUNCH, PROXY)
        • check-success = Matrixone Standlone CI / Multi-CN e2e BVT Test on Linux/x64(LAUNCH, PROXY)
      • any of [🛡 GitHub branch protection]:
        • check-neutral = Matrixone Standlone CI / e2e BVT Test on Linux/x64(LAUNCH, PESSIMISTIC)
        • check-skipped = Matrixone Standlone CI / e2e BVT Test on Linux/x64(LAUNCH, PESSIMISTIC)
        • check-success = Matrixone Standlone CI / e2e BVT Test on Linux/x64(LAUNCH, PESSIMISTIC)
      • any of [🛡 GitHub branch protection]:
        • check-neutral = Matrixone CI / UT Test on Ubuntu/x86
        • check-skipped = Matrixone CI / UT Test on Ubuntu/x86
        • check-success = Matrixone CI / UT Test on Ubuntu/x86
      • any of [🛡 GitHub branch protection]:
        • check-neutral = Matrixone Utils CI / Coverage
        • check-skipped = Matrixone Utils CI / Coverage
        • check-success = Matrixone Utils CI / Coverage
      • #review-threads-unresolved = 0 [🛡 GitHub branch protection]
      • github-review-approved [🛡 GitHub branch protection] (documentation)
      • github-review-decision = APPROVED [🛡 GitHub branch protection] (documentation)
      • any of [🛡 GitHub branch protection]:
        • check-success = Matrixone CI / SCA Test on Linux/arm64
        • check-neutral = Matrixone CI / SCA Test on Linux/arm64
        • check-skipped = Matrixone CI / SCA Test on Linux/arm64
    • all of [📌 queue conditions of queue rule release-4.1]:
      • any of [🛡 GitHub branch protection]:
        • check-neutral = Matrixone Compose CI / multi cn e2e bvt test docker compose(PESSIMISTIC)
        • check-skipped = Matrixone Compose CI / multi cn e2e bvt test docker compose(PESSIMISTIC)
        • check-success = Matrixone Compose CI / multi cn e2e bvt test docker compose(PESSIMISTIC)
      • any of [🛡 GitHub branch protection]:
        • check-neutral = Matrixone Standlone CI / Multi-CN e2e BVT Test on Linux/x64(LAUNCH, PROXY)
        • check-skipped = Matrixone Standlone CI / Multi-CN e2e BVT Test on Linux/x64(LAUNCH, PROXY)
        • check-success = Matrixone Standlone CI / Multi-CN e2e BVT Test on Linux/x64(LAUNCH, PROXY)
      • any of [🛡 GitHub branch protection]:
        • check-neutral = Matrixone Standlone CI / e2e BVT Test on Linux/x64(LAUNCH, PESSIMISTIC)
        • check-skipped = Matrixone Standlone CI / e2e BVT Test on Linux/x64(LAUNCH, PESSIMISTIC)
        • check-success = Matrixone Standlone CI / e2e BVT Test on Linux/x64(LAUNCH, PESSIMISTIC)
      • any of [🛡 GitHub branch protection]:
        • check-neutral = Matrixone CI / UT Test on Ubuntu/x86
        • check-skipped = Matrixone CI / UT Test on Ubuntu/x86
        • check-success = Matrixone CI / UT Test on Ubuntu/x86
      • any of [🛡 GitHub branch protection]:
        • check-neutral = Matrixone Utils CI / Coverage
        • check-skipped = Matrixone Utils CI / Coverage
        • check-success = Matrixone Utils CI / Coverage
      • #review-threads-unresolved = 0 [🛡 GitHub branch protection]
      • github-review-approved [🛡 GitHub branch protection] (documentation)
      • github-review-decision = APPROVED [🛡 GitHub branch protection] (documentation)
      • any of [🛡 GitHub branch protection]:
        • check-success = Matrixone CI / SCA Test on Linux/arm64
        • check-neutral = Matrixone CI / SCA Test on Linux/arm64
        • check-skipped = Matrixone CI / SCA Test on Linux/arm64
  • -closed [📌 queue requirement]
  • -conflict [📌 queue requirement]
  • -draft [📌 queue requirement]
  • any of [📌 queue -> configuration change requirements]:
    • -mergify-configuration-changed
    • check-success = Configuration changed
  • any of [📌 queue requirement]:
    • check-neutral = Mergify Merge Protections
    • check-skipped = Mergify Merge Protections
    • check-success = Mergify Merge Protections

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

kind/bug Something isn't working queued size/XXL Denotes a PR that changes 2000+ lines

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants